package com.zqcy.workbench.utils;

import android.content.Context;
import android.content.SharedPreferences;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Preferences {

    /**
     * 使用SharedPreferences保存List
     * 支持类型：List<String>，List<JavaBean>
     *
     * @param context  上下文
     * @param key      储存的key
     * @param dataList 存储数据
     * @param <T>      泛型
     */
    public static <T> void setDataList(Context context, String key, List<T> dataList) {
        if (null == dataList) {
            return;
        } else {
            dataList.size();
        }
        SharedPreferences sp = context.getSharedPreferences(Constants.APP_SP_NAME, Context.MODE_PRIVATE);
        Gson gson = new Gson();
        //转换成json数据，再保存
        String strJson = gson.toJson(dataList);
        SharedPreferences.Editor editor = sp.edit();
        editor.putString(key, strJson);
        editor.apply();
    }

    /**
     * 获取SharedPreferences保存的List
     *
     * @param context 上下文
     * @param key     储存的key
     * @param <T>     泛型
     * @return 存储List<T>数据
     */
    public static <T> List<T> getDataList(Context context, String key, Class<T> cls) {
        SharedPreferences sp = context.getSharedPreferences(Constants.APP_SP_NAME, Context.MODE_PRIVATE);
        List<T> dataList = new ArrayList<T>();
        String strJson = sp.getString(key, null);
        if (null == strJson) {
            return dataList;
        }

        Gson gson = new Gson();

        //使用泛型解析数据会出错，返回的数据类型是LinkedTreeMap
//        dataList = gson.fromJson(strJson, new TypeToken<List<T>>() {
//        }.getType());

        //这样写，太死
//        dataList = gson.fromJson(strJson, new TypeToken<List<UserModel>>() {
//        }.getType());

        JsonArray arry = new JsonParser().parse(strJson).getAsJsonArray();
        for (JsonElement jsonElement : arry) {
            dataList.add(gson.fromJson(jsonElement, cls));
        }

        return dataList;
    }

    /**
     * 使用SharedPreferences保存集合
     *
     * @param context 上下文
     * @param key     储存的key
     * @param map     map数据
     */
    public static <K, V> void setHashMapData(Context context, String key, Map<K, V> map) {
        if (map == null) {
            return;
        }

        SharedPreferences sp = context.getSharedPreferences(Constants.APP_SP_NAME, Context.MODE_PRIVATE);
        Gson gson = new Gson();
        String strJson = gson.toJson(map);
        SharedPreferences.Editor editor = sp.edit();
        editor.putString(key, strJson);
        editor.apply();
    }

    /**
     * 获取SharedPreferences保存的集合
     *
     * @param context 上下文
     * @param key     储存的key
     * @param clsV    解析类型
     * @return Map集合
     */
    public static <V> Map<String, V> getHashMapData(Context context, String key, Class<V> clsV) {
        SharedPreferences sp = context.getSharedPreferences(Constants.APP_SP_NAME, Context.MODE_PRIVATE);
        Map<String, V> map = new HashMap<>();
        String strJson = sp.getString(key, "");
        Gson gson = new Gson();
        JsonObject obj = new JsonParser().parse(strJson).getAsJsonObject();
        Set<Map.Entry<String, JsonElement>> entrySet = obj.entrySet();
        for (Map.Entry<String, JsonElement> entry : entrySet) {
            String entryKey = entry.getKey();
            JsonObject value = (JsonObject) entry.getValue();
            map.put(entryKey, gson.fromJson(value, clsV));
        }
        return map;
    }

}
